home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / VISUALBA / LOADGIF.ZIP / LOADGIF.ASM < prev    next >
Assembly Source File  |  1993-08-20  |  45KB  |  1,459 lines

  1. ;LOADGIF.ASM v1.0 - Optimized GIF Loader for EGA and VGA Video Modes
  2. ;By Rich Geldreich, Jr.
  3. ;Last Modified August 20, 1993
  4. ;Assembled with TASM v2.0
  5.  
  6. IDEAL
  7. MODEL SMALL
  8.  
  9. ;-------------------------------------------------------------------------------
  10. MACRO           PushaMacro
  11.                 Push    ax
  12.                 Push    bx
  13.                 Push    cx
  14.                 Push    dx
  15.                 Push    si
  16.                 Push    di
  17.                 Push    bp
  18. ENDM            PushaMacro
  19. ;-------------------------------------------------------------------------------
  20. MACRO           PopaMacro
  21.                 Pop     bp
  22.                 Pop     di
  23.                 Pop     si
  24.                 Pop     dx
  25.                 Pop     cx
  26.                 Pop     bx
  27.                 Pop     ax
  28. ENDM            PopaMacro
  29. ;-------------------------------------------------------------------------------
  30. ;This equate specifies the size the disk I/O buffer.
  31. ;Make sure it's at least 1024 or so bytes long.
  32. DiskIOSize      = 8192
  33. ;-------------------------------------------------------------------------------
  34. RP              = 0
  35. ;-------------------------------------------------------------------------------
  36. ;I/O Control.
  37. BufferOffset    = RP
  38. RP = RP + 2
  39. BufferLeft      = RP
  40. RP = RP + 2
  41. BufferHandle    = RP
  42. RP = RP + 2
  43. EOFFlag         = RP
  44. RP = RP + 2
  45. ;-------------------------------------------------------------------------------
  46. ;GIF Decoding & Image Size.
  47. TotalX          = RP
  48. RP = RP + 2
  49. TotalY          = RP
  50. RP = RP + 2
  51. NumColors       = RP
  52. RP = RP + 2
  53. XStart          = RP
  54. RP = RP + 2
  55. YStart          = RP
  56. RP = RP + 2
  57. XLength         = RP
  58. RP = RP + 2
  59. YLength         = RP
  60. RP = RP + 2
  61. XEnd            = RP
  62. RP = RP + 2
  63. YEnd            = RP
  64. RP = RP + 2
  65. X               = RP
  66. RP = RP + 2
  67. Y               = RP
  68. RP = RP + 2
  69. ;-------------------------------------------------------------------------------
  70. ;View window & Upper left hand corner of GIF image.
  71. XOrg            = RP
  72. RP = RP + 2
  73. YOrg            = RP
  74. RP = RP + 2
  75. X0              = RP
  76. RP = RP + 2
  77. Y0              = RP
  78. RP = RP + 2
  79. X1              = RP
  80. RP = RP + 2
  81. Y1              = RP
  82. RP = RP + 2
  83. ;-------------------------------------------------------------------------------
  84. ;Hardware parameters.
  85. VidColors       = RP
  86. RP = RP + 2
  87. Handler         = RP
  88. RP = RP + 2
  89. ScrOffset       = RP
  90. RP = RP + 2
  91. ScrWidth        = RP
  92. RP = RP + 2
  93. ScrX            = RP
  94. RP = RP + 2
  95. ScrY            = RP
  96. RP = RP + 2
  97. PixsLeft        = RP
  98. RP = RP + 2
  99. AdapterType     = RP
  100. RP = RP + 2
  101. PalIgnore       = RP
  102. RP = RP + 2
  103. ;-------------------------------------------------------------------------------
  104. ;LZW Decompression.
  105. PassNumber      = RP
  106. RP = RP + 2
  107. PassStep        = RP
  108. RP = RP + 2
  109. Background      = RP
  110. RP = RP + 2
  111. NoPalette       = RP
  112. RP = RP + 2
  113. Interlaced      = RP
  114. RP = RP + 2
  115. FirstCode       = RP
  116. RP = RP + 2
  117. StartCode       = RP
  118. RP = RP + 2
  119. StartMaxCode    = RP
  120. RP = RP + 2
  121. NextCode        = RP
  122. RP = RP + 2
  123. LastCode        = RP
  124. RP = RP + 2
  125. LastPixel       = RP
  126. RP = RP + 2
  127. StartCodeMask   = RP
  128. RP = RP + 2
  129. StartCodeSize   = RP
  130. RP = RP + 2
  131. ;-------------------------------------------------------------------------------
  132. ;Scanline buffer. A maximum of 1536 pixels per scanline should be enough.
  133. LineBuffer      = RP
  134. RP = RP + 1536
  135. ;-------------------------------------------------------------------------------
  136. ;LZW string tables. The Suffix table MUST come directly before Prefix in memory!
  137. Suffix          = RP
  138. RP = RP + 4096*2
  139. Prefix          = RP
  140. RP = RP + 4096*2
  141. PStack          = RP
  142. RP = RP + 4096+128
  143. ;-------------------------------------------------------------------------------
  144. ;GIF's palette.
  145. Palette         = RP
  146. RP = RP + 768
  147. ;-------------------------------------------------------------------------------
  148. ;Disk I/O buffer.
  149. RP = RP + 16
  150. DiskBuffer      = RP
  151. RP = RP + DiskIOSize
  152. ;-------------------------------------------------------------------------------
  153. ;For 16 color pixel plotting.
  154. Plane0          = RP
  155. RP = RP + 80
  156. Plane1          = RP
  157. RP = RP + 80
  158. Plane2          = RP
  159. RP = RP + 80
  160. Plane3          = RP
  161. RP = RP + 80
  162. ;-------------------------------------------------------------------------------
  163. ;The value of RP here determines how much memory the function requires.
  164. ;-------------------------------------------------------------------------------
  165. SEGMENT         GIFCODE PARA PUBLIC 'CODE'
  166. ;-------------------------------------------------------------------------------
  167. ASSUME          DS:@DATA, ES:@DATA, CS:GIFCODE, SS:@DATA
  168. ;-------------------------------------------------------------------------------
  169. ;In ERROR.ASM
  170. EXTRN           ErrorCode:WORD
  171. EXTRN           Hook24:NEAR, Unhook24:NEAR, CheckError:NEAR
  172. ;-------------------------------------------------------------------------------
  173. PUBLIC          LoadGIF
  174. PROC            LoadGIF
  175.  
  176. ;Stack organization.
  177. MemPointer      EQU     [ss:bp+42]
  178. FileSeg         EQU     [ss:bp+40]
  179. FileOfs         EQU     [ss:bp+38]
  180.  
  181. PScrType        EQU     [ss:bp+36]
  182. PScrOffset      EQU     [ss:bp+34]
  183. PScrWidth       EQU     [ss:bp+32]
  184. PXRes           EQU     [ss:bp+30]
  185. PYRes           EQU     [ss:bp+28]
  186.  
  187. PX0             EQU     [ss:bp+26]
  188. PY0             EQU     [ss:bp+24]
  189. PX1             EQU     [ss:bp+22]
  190. PY1             EQU     [ss:bp+20]
  191. PXOrg           EQU     [ss:bp+18]
  192. PYOrg           EQU     [ss:bp+16]
  193.  
  194. PAdapterType    EQU     [ss:bp+14]
  195. PPalIgnore      EQU     [ss:bp+12]
  196.  
  197. PPalSeg         EQU     [ss:bp+10]
  198. PPalOfs         EQU     [ss:bp+08]
  199. PPalColors      EQU     [ss:bp+06]
  200.  
  201. Parameters      = 19
  202.  
  203.                 Cld
  204.                 Push    bp
  205.                 Mov     bp, sp
  206.                 Push    ds es si di
  207.  
  208.                 Call    Hook24          ;Install critical error handler.
  209.  
  210.                 Mov     ax, MemPointer
  211.                 Mov     ds, ax
  212.                 Mov     es, ax
  213.  
  214.                 Call    Init            ;Fetch passed parameters.
  215.                 Jc      @@OpenError
  216.  
  217.                 Call    CheckOpts       ;Check passed window coordinates.
  218.                 Jc      @@NothingToDo
  219.  
  220.                 Call    IOOpen          ;Open GIF file.
  221.                 Jc      @@OpenError
  222.  
  223.                 Call    IOReadInit      ;Initialize disk I/O buffer.
  224.                 Jc      @@Error
  225.  
  226.                 Call    GetGIFHeader    ;Fetch GIF sig, tables, etc.
  227.                 Jc      @@Error
  228.  
  229.                 Call    SetPalette      ;Set GIF's palette.
  230.  
  231.                 Call    DecodeGIF       ;Decompress GIF.
  232.                 Jc      @@Error
  233.  
  234.                 Xor     ax, ax          ;No error.
  235.  
  236. @@Exit0:        Push    ax
  237.                 Call    IOClose         ;Close input file.
  238.                 Pop     ax
  239.  
  240. @@Exit1:        Call    Unhook24        ;Uninstall critical error handler.
  241.                 Cld
  242.                 Pop     di si es ds bp
  243.                 Retf    Parameters*2
  244.  
  245. @@Error:        Mov     ax, -1
  246.                 Jmp     @@Exit0
  247. @@OpenError:    Mov     ax, -1
  248.                 Jmp     @@Exit1
  249. @@NothingToDo:  Xor     ax, ax
  250.                 Jmp     @@Exit1
  251. ENDP            LoadGIF
  252. ;-------------------------------------------------------------------------------
  253. PROC            Init
  254. ;---------------
  255. ;Clear work space.
  256.                 Xor     ax, ax
  257.  
  258.                 Mov     di, offset BufferOffset
  259.                 Mov     cx, RP                  ;Clear memory block.
  260.  
  261.                 Shr     cx, 1
  262.                 Rep     Stosw
  263.                 Rcl     cx, 1
  264.                 Rep     Stosb
  265. ;---------------
  266. ;Fetch & check passed parameters from stack.
  267.                 Mov     ax, PScrType
  268.                 Cmp     ax, 2
  269.                 Ja      @@Error1
  270.  
  271.                 Mov     bx, offset WPIX1        ;assume mode 13
  272.                 Mov     cx, 256
  273.  
  274.                 And     ax, ax
  275.                 Jnz     @@10
  276.  
  277.                 Mov     bx, offset WPIX0        ;16 color modes
  278.                 Mov     cx, 16
  279. @@10:
  280.                 Cmp     al, 2
  281.                 Jn